import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 设置随机数种子以确保可重复性
np.random.seed(42)

# 生成包含异常值的数据
MEAN = 50
STD = 10

normal = np.random.normal(MEAN, STD, 100)
data = {
    'value': np.concatenate([normal, [150, 200, -MEAN]])
}
df = pd.DataFrame(data)

# 绘制直方图
# normal:要绘制的数组；bins=10代表将数据划分为10份；
# density=True：表示绘制的是概率密度直方图，而不是普通的频数直方图。这样直方图的总面积为 1，便于比较不同分布的形状
# alpha=0.7：设置直方图的透明度为 0.7
# color='steelblue'：设置直方图的颜色为钢蓝色
plt.hist(normal, bins=STD, density=True, alpha=0.7, color='steelblue')

# 绘制正态分布曲线
x = np.linspace(20, 80, 100)
pdf = 1 / (STD * np.sqrt(2 * np.pi)) * np.exp(-(x - MEAN) ** 2 / (2 * STD ** 2))
plt.plot(x, pdf, 'r', linewidth=2)

plt.show()

# 1.标准差法：
# 一般认为：小于均值 - 3倍标准差
# 或者：   大于均值 + 3被标准差的值是异常值
min_val = MEAN - 3 * STD
max_val = MEAN + 3 * STD

un_normal = df[(df['value'] < min_val) | (df['value'] > max_val)]
